/**********************************************************************************\
** 文件名称: VS1838.h
** 创建人员: YCG
** 创建日期: 2017-11-1
** 文档描述:
** 版本代号: V0.1
** 版本说明: 初始版本
  \********************************************************************************/
#include "VS1838.h"
#include "config.h"
u8  IR_state = 0, IR_bit = 0;         //接收状态，接收数据位计数
static u32 last_time, now_time, IR_read, IR_output;   //上次中断时间，本次中断时间，数据读取，数据输出
u8 xunji_flag = 0;
/*******************************************************************************
** 函数名称: vs_init
** 功能描述: IR中断初始化
** 参数说明: None
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-17
********************************************************************************/
void vs_init()
{
    INT0 = 1;
    IT0 = 0;                    //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
    EX0 = 1;                    //使能INT0中断
    EA = 1;
}
/*******************************************************************************
** 函数名称: vs_interrupt
** 功能描述: 中断函数
** 参数说明: : [输入/出]
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2018-11-17
*******************************************************************************/
void exint0() interrupt 0
{
    now_time = micros();         //获取现在的时间，单位微秒
    if (now_time > last_time)
        switch (IR_state)        //判断目前接收状态
        {
        case IR_START:                  //信号开始状态
            if (INT0 == 0)   //判断引脚的电压值
            {
                IR_read = 0;            // 状态清零
                IR_bit = 0;
                last_time = now_time;   //更新目前的时间
                IR_state = IR_START_L;   //进去下一次的状态
            }
            break;
        case IR_START_L:                 //检测起始低电平
            if (INT0 && (now_time - last_time > 2750))  //确保是起始低电平
            {
                IR_state = IR_START_H;       //进去下一次的状态
                last_time = now_time;        //更新目前的时间
            }
            else
            {
                IR_state = IR_START;          //返回起始状态
            }
            break;
        case IR_START_H:                      //检测起始高电平
            if ((INT0 == 0) && (now_time - last_time > 2750)) //确保是起始高电平
            {
                IR_state = IR_BEGIN;         //进去读取数据状态
                last_time = now_time;        //更新目前的时间
            }
            else
            {
                IR_state = IR_START;          //返回起始状态
            }
            break;
        case IR_BEGIN:                        //检测每一位的开始
            if ((INT0 == 1) && (now_time - last_time < 750))   //脉宽值=500
            {
                last_time = now_time;        //更新目前的时间
                if (IR_bit < 16)             //只有十六位数据
                {
                    IR_state = IR_READ;      //读取数据
                }
                else
                {
                    IR_state = IR_END;      //结束本次接收
                }
            }
            else
            {
                IR_state = IR_START;        //接收错误，返回起始状态
            }
            break;
        case IR_READ:
            if ((INT0 == 0) && (now_time - last_time < 2000))      //数据1 1.4ms
            {
                IR_read = IR_read << 1;      //数据右移一位
                last_time = now_time;        //更新目前的时间
                IR_read |= 0x0001;           //读取数据
                IR_bit++;                    //读取计数加一
                IR_state = IR_BEGIN;         //进入下一次数据读取
            }
            else if ((INT0 == 0) && (now_time - last_time < 2750))  //数据0 2.4ms
            {
                IR_read = IR_read << 1;      //数据右移一位
                last_time = now_time;
                IR_read &= ~0x0001;             //读取数据
                IR_bit++;
                IR_state = IR_BEGIN;
            }
            else
            {
                IR_state = IR_START;          //读取错误，返回起始状态
            }
            break;
        case IR_END:                          //结束接收
            if (now_time - last_time > 3750)   //结束符，4ms
            {
                IR_output = IR_read;               //数据输出
                UartSendNumln(IR_read);
                vs_read();                         //接收数据处理
                last_time = now_time + 70000;        //因为每次都是发送两次一样的，跳过不验证了
            }
            IR_state = IR_START;                   //返回起始状态
            break;
        }
}

/*******************************
   名称：接收处理
*********************************/
void vs_read()
{
    setbeep(100);
    switch (IR_output)
    {
    case 0xFDD4:
        SpeedCtrl(150, 150, 200, 0); //按键上
        break;
    case 0xFDD3:
        SpeedCtrl(-150, -150, 200, 0); //按键下
        break;
    case 0xFDD2:
        SpeedCtrl(-100, 100, 200, 1); //按键左
        break;
    case 0xFDD1:
        SpeedCtrl(100, -100, 200, 1); //按键左//按键右
        break;
    case 0xFDD0:
        xunji_flag = ~xunji_flag; //按键中
        break;
    case 0xFDF4:   //按键关机
        break;
    }
    IR_output = 0;
}

u8 Getxunji_flag() {
    return xunji_flag;
}
